package com.jame.basics.thread.queue;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author : Jame
 * @date : 2021-01-14 19:45
 * 同步队列
 **/
public class SynchronousQueueDemo {
    public static void main(String[] args) {





        SynchronousQueue<String> synchronousQueue = new SynchronousQueue<>();
        /**
         * SynchronousQueue 也是一个队列来的，但它的特别之处在于它内部没有容器，
         * 一个生产线程，当它生产产品（即put的时候），如果当前没有人想要消费产品(即当前没有线程执行take)，
         * 此生产线程必须阻塞，等待一个消费线程调用take操作，take操作将会唤醒该生产线程，
         * 同时消费线程会获取生产线程的产品（即数据传递），
         * 这样的一个过程称为一次配对过程(当然也可以先take后put,原理是一样的)。
         *
         *
         * 生产一个没有消费就不生产了,直到队列中被消费
         */
        new Thread(() -> {
            try {
                while (true) {
                    System.out.println("添加一个");
                    synchronousQueue.put("1");
                    TimeUnit.MILLISECONDS.sleep(1);
                }


            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(() -> {
            try {
                while (true) {
                    System.out.println(synchronousQueue.take());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }

}